/*
Copyright (c) [2019年5月1日] [吴超]
[MBT_studio] is licensed under Mulan PSL v2.
You can use this software according to the terms and conditions of the Mulan PSL v2.
You may obtain a copy of Mulan PSL v2 at:
		 http://license.coscl.org.cn/MulanPSL2
THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND,
EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT,
MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE.
See the Mulan PSL v2 for more details.
*/
#pragma once


#include "引擎枚举数据.h"
#include "core/设备内存缓存.h"

typedef enum {
	e_tf_R8,
	e_tf_RG8,
	e_tf_RGB8,
	e_tf_RGBA8,

	e_tf_R16,
	e_tf_RG16,
	e_tf_RGB16,
	e_tf_RGBA16,

	e_tf_R32,
	e_tf_RG32,
	e_tf_RGB32,
	e_tf_RGBA32,





	e_tf_R8U,
	e_tf_RG8U,
	e_tf_RGB8U,
	e_tf_RGBA8U,

	e_tf_R8U_U,
	e_tf_RG8U_U,
	e_tf_RGB8U_U,
	e_tf_RGBA8U_U,

	e_tf_R16U,
	e_tf_RG16U,
	e_tf_RGB16U,
	e_tf_RGBA16U,

	e_tf_R32U,
	e_tf_RG32U,
	e_tf_RGB32U,
	e_tf_RGBA32U,

	e_tf_R32U_U,
	e_tf_RG32U_U,
	e_tf_RGB32U_U,
	e_tf_RGBA32U_U,




	e_tf_深度纹理,



	e_tf_D16,
	e_tf_D24,
	e_tf_D32,
	e_tf_D64,
	e_tf_D32F,


}E_纹理格式;



enum E_纹理排列 : uint32 {
	e_瓦片 = 0,
	e_线性 = 1,
	e_DRM_FORMAT_MODIFIER = 2,
	e_BEGIN_RANGE = 3,
	e_END_RANGE = 4,
	e_RANGE_SIZE = 5,
	e_MAX_ENUM = 6,
};

enum E_纹理用途 : uint32 {
	e_采样				= 1<<0,
	e_贮存				= 1 << 1,
	e_转移源			= 1 << 2,
	e_转移目标			= 1 << 3,
	e_暂存附件			= 1 << 4,
	e_颜色附件			= 1 << 5,
	e_深度模板附件		= 1 << 6,
	e_输入附件			= 1 << 7,
	e_SHADING_RATE		= 1 << 8,
	e_FRAGMENT_DENSITY_MAP = 1 << 9,
	e_短时附件 = 1 << 10,
};

enum E_纹理维度类型 : uint32 {
	e_1D,
	e_2D,
	e_3D,
	e_1D_Array,
	e_2D_Array,
	e_CUBE,
	e_CUBE_Array,
};

enum E_纹理拉伸方式 : uint32 {
	e_重复,
	e_镜像重复,
	e_边缘,
	e_镜像边缘,
	e_边框,
};



struct S_纹理采样器 {
	//uvec3	m_拉伸方式;

	virtual ~S_纹理采样器() {}
};

struct S_纹理 {
	std::wstring    m_Name;
	E_MS次数		m_采样;
	E_纹理格式		m_格式;
	E_纹理维度类型	m_类型;
	uvec3			m_Size;
	vec3			m_默认颜色;

	uint32		m_用途;
	uint32		m_ID;
	int32       m_纹理坐标计算类型;
	int32		m_TexID;

	
	S_设备环境*	m_Ctx;
	S_结构对象指针 m_命令缓存;
	//void f_填充纹理(vec4);
	S_纹理(){
		m_采样 = E_MS次数::e_MS_1;

		m_格式 = E_纹理格式::e_tf_RGBA8U_U;
		m_默认颜色 = { 1,1,1 };
		m_Size = { 0,0,1 };

		m_纹理坐标计算类型 = 0;
		m_TexID = -1;
		m_ID = 0;
		m_命令缓存 = nullptr;
	}

	virtual ~S_纹理(){}
};





struct S_纹理采样器创建参数 {
	E_纹理拉伸方式 U;
	E_纹理拉伸方式 V;
	E_纹理拉伸方式 W;
};






S_纹理* f_tex_创建图像纹理(S_设备环境& ctx, uvec3 size, E_纹理格式 格式, E_纹理维度类型 类型, E_MS次数 采样 = E_MS次数::e_MS_1, E_纹理排列 平铺方式 = E_纹理排列::e_瓦片);
S_纹理* f_tex_创建深度纹理(S_设备环境& ctx, uvec3 size, E_MS次数 采样, E_纹理格式 格式 = E_纹理格式::e_tf_D32F);
S_纹理* f_tex_创建帧缓存纹理(S_设备环境& ctx, uvec3 size, E_纹理格式 格式, E_纹理维度类型 类型, E_MS次数 采样 = E_MS次数::e_MS_1, E_纹理排列 平铺方式 = E_纹理排列::e_瓦片);
S_纹理* f_tex_创建存储2D纹理(S_设备环境& ctx, uvec3 size, E_纹理格式 格式, uint32 用途, E_MS次数 采样 = E_MS次数::e_MS_1);

void f_tex_销毁纹理(S_纹理* tex);


S_纹理采样器* f_tex_创建纹理采样器(S_设备环境& ctx, S_纹理采样器创建参数 参数 = { E_纹理拉伸方式::e_边框, E_纹理拉伸方式::e_边框, E_纹理拉伸方式::e_边框 });

void f_tex_安装纹理采样器(S_纹理* tex, S_纹理采样器* sample);

void f_tex_填充纹理数据(S_纹理* tex, const uint8* t, uint16 offset, uvec3 dim, S_结构对象指针 命令缓存 = nullptr);
void f_tex_读取纹理数据(S_纹理* tex, S_板载缓存* 临时缓存, S_结构对象指针 命令缓存 = nullptr);


void f_tex_修改大小(S_纹理* tex, uvec2 newSize);
void f_tex_修改大小(S_纹理* tex, uvec3 newSize);

void f_tex_拷贝(S_结构对象指针 cmd, S_纹理* 源, S_纹理* 目标);
void f_tex_拷贝(S_结构对象指针 cmd, S_纹理* 源, S_板载缓存* 目标);


